Eerste aanzet tot ...

Oedipus II Ontwikkel Kit (OOK)

voor

Odp Plug-Ins



OOK versie 1.07. Deze hoort bij Oedipus versie 4.26 en 4.27

Waarom OOK niet?
Zelf programmeren in Oedipus II nu makkelijk gemaakt met de Oedipus II ontwikkel kit (OOK) voor Odp Plug-Ins.

Het ideale genealogie programma bestaat niet. En dat zal ook wel nooit geschreven worden.  Iedereen stelt weer andere eisen en heeft andere wensen. Zoveel mensen, zoveel zinnen. En dat is maar goed ook.
.
De OOK stelt u in staat om onafhankelijk van iedereen toepassingen te schrijven in de vorm van Plug-Ins, die  gebruik maken van de Oedipus structuur.  U hebt hierbij de volledige controle over alle gegevens. U kunt dus ten alle tijde de gegevens uit de Oedipus database halen en  transformeren tot elk ander formaat. In de OOK voorbeelden om de gegevens in Tabs begrensd formaat naar een bestand te schrijven. Dit bestand kan in bijv. MS-Excel worden ingelezen.
 

Wat is een Odp Plug-In.
 
Odp Plug-Ins zijn programma's in de vorm van een DLL (Dynamic Linked Library). Ze kunnen onafhankelijk van Oedipus worden samengesteld.

De entree functie van de DLL heet RunUser(void) of RunOpi(void) en moet aan een paar voorwaarden voldoen.
De interface met het Oedipus programma is de ontwikkel kit.

De Plug-Ins worden automatisch in het Oedipus menu systeem opgenomen onder 'procedures'. De tekst van de menu ingang kunt u zelf bepalen.

Wat hebt u nodig. De C++ compiler.
 
Zelf gebruik ik Borland C++ 4.5. Deze was nieuw in 1994 en nu dus sterk verouderd, waarschijnlijk kunt u hem voor een paar tientje op een PC dumpdag wel op de kop tikken. Mogelijk kunt hem ook nog wel ergens bietsen voor nop. De verstrekte voorbeelden kunt u hier zonder meer in inlezen en eventueel aanpassen. Succes verzekerd.
(En denk nu niet dat deze compiler minder waardig is. U kunt hier alles mee doen wat u wilt!)

Andere C++ compiler?
Als het Borland C++ 5 of een Builder is, dan zal dat waarschijnlijk zonder grote problemen gaan.
Niet Borland ligt mogelijk iets moeilijker. Ik heb daar zelf geen ervaring mee, maar moet zonder al te grote problemen kunnen. Ik geef hiervoor ook een interface.

Mogelijk dat met Delphi zelfs nog wel iets te doen is. Dat zouden we aan de Delphi goeroes moeten vragen.

Hier drie gratis Windows C++ compilers. Ik heb er geen ervaring mee.
Neem er ook de gratis IDE bij, want zonder IDE valt er eigenlijk niet te werken.

Moet u eerst nog even uw C/C++ kennis opfrissen? Hieronder een aantal tutorials en FAQs.

C tutorial
C Programming Reference
Programming in C  Hier een aantal boeken, ook de originele tekt  door Kernighan and Ritchie (staat bekend als K&R).
C++ Tutorial
introductie to c++
C++ Faq
The C++ Programming Language Bjarne Stroustrup. (Lees wat deze genie te vertellen heeft!)
DLL Tutorial voor de Builder
K&R
Jon's C++ Directory Hier nog meer!


De Oedipus Ontwikkel Kit. Wat is het precies?

Allereerst de vier bestanden waar de hele functionaliteit in zit.

  • (Odp40.exe      Vervangt de oude Odp40.exe. In deze zit de Plug-In functionaliteit.) Zit reeds in Odp4.26
  • OpiSys.hpp      header file. Moet in uw applicatie worden ge"#include"
  • OpiSys.lib        bibliotheek definities voor de export functies..
  • (OpiSys.dll        bibliotheek met systeem functies. Moet in uw applicatie worden gelinkt en moet in de Oedipus directory staan.) Zit reeds in Odp4.26.
  • Voorbeelden

    Voorbeelden met de volledige source. Hier kunt u meteen mee aan de slag.
    De annotatie in de voorbeelden is een onderdeel van de Handleiding!!

    Het eerste voorbeeld is in 'plain' Windows. Deze is geschikt voor elke C++ compiler. De routine is erg simple gehouden en dient alleen ter illustratie. Het is aan te bevelen om hier mee te beginnen. De routine selecteert van de eerste honderd kaarten in een database drie velden en schrijft die als tabs begrensd naar een bestand. Dit bestand kan in MS-EXCEL worden ingelezen.

    Het tweede voorbeeld is in Borlands OWL. Dit voorbeeld is wat meer functionaliteit gegeven dan het eerste. De routine selecteerd van de eerste honderd kaarten in de database vijf velden en schrijft die als tabs begrensd naar een bestand. De vijf velden kunnen worden opgegeven evenals de naam van het bestand. De volledige source code van opiKwart.dll (construeert kwartierstaten in html met frames). Mag u mee doen wat u wilt!
    Bestanden: De volledige source code van opiSekse.dll (zoekt personen waarvan het geslacht niet bekend is).
    Bestanden:


    Down loaden

    HIER! OOK007


    De vorm van de PLUG-IN DLL
     

    Verplichte structuur van de Start functie

    De rc file moet de volgende code bevatten
     
    #define ODPVERSION  818
    #define ROUTINE         1200

    STRINGTABLE
    {
     ODPVERSION, "1.00"                          // Hier kunt u uw versie nummer geven. Het verdient aanbeveling om
                                                                       //       dezelfde te nemen als die in OpiSys.dll zit
     ROUTINE, "Test OWL Plug In"           // en hier de tekst voor het menu
    }

    Verplichte naamgeving van de Plug-Ins
     
    Om Oedipus in staat te stellen de Plug-Ins te vinden moeten ze in de Oedipus directory staan en moet de naam zijn OpiUser1.dll, OpiUser2.dll enz. tot met OpiUser8.dll.

    Handleiding

    Momenteel zijn er twee classes in de ontwikkel kit beschikbaar:
    Zie ook de voorbeelden!!

    class OpiSystem

    OpiSystem(void);                              constructor

    int FieldName(int ref, char *buf);       geeft tekst veld label, zie voorbeeld twee.
    void *GetHandle(int i);                      geeft de handle met de Oedipus MainWindow
                                                             i   kan zijn HWINDOW of TWINDOW voor
                                                             resp. HWND of TWindow*
     

    class Indi_Sheet
    constructor
    Indi_Sheet(int Tag, OpiSystem *System);        // type 1
    Indi_Sheet(Indi_Sheet *Kaart, int Fpos=0);     // type 2

    functies
    int Field(int Fpos, char *buf, int *ref);                                   // Geeft het Fpos veld
    int NextField(char *buf, int *ref);                                          // Geeft het volgende veld
    int Compare(Indi_Sheet *Kaart);                                          // vergelijkt twee kaarten
    int Status(void);                                                                    // geeft status kaart
    int FieldType(int Ftype, char *buf, int numField=0);               // geeft veldtype in buf
    int Place(int Ftype, char *buf, Indi_Sheet *hKaart=NULL);  // geeft plaatsnaam in buf van Ftype
    int Date (int Ftype, char *buf, Indi_Sheet *hKaart=NULL);  // geeft datum in buf van Ftype
    Indi_Sheet *CreateSheet(int Ftype, int numMar=0);              // creeert een Kaart van Ftype

    De laatste drie functies zijn volledig in de andere functies uit te drukken. Echter om de snelheid op te voeren,. heb ik ze in deze class geplaatst.

    variabelen
    Indi_Sheet *Ext;         Om een linked list te maken
    int Id;                          Identificatie
    char *StId;                  wordt vrijgegeven als delete[], dus alleen vullen met new char[i]

    Toepassingen

    Status van de kaart

    Kaart->Status()    ==  SHT_OK       (alles ok)
                               SHT_FOC     (geen kaart op het scherm)
                               SHT_NEXT   (Kaarten zijn op)
                               SHT_OPI       (Geen OpiSystem)
                               SHT_EMPTY (Kaart leeg)

    ok=Kaart->FieldType(FOTO, buf);       // geeft het pad naar de pasfoto. Dit is momenteel de enige toepassing
                                                                     // ok=0 er is iets mis, ok=1 succes

            ok=Kaart->Place(GEBOREN,buf);                          // geeft geboorte plaats
            ok=KaartPa->Place(HUWELIJK, buf, KaartMa);  // geeft huwelijkplaats. Als KaartMa is gegeven, wordt daar
                                                                                                //           eventueel ook gezocht.
                   Hier kan ook DOOP, GECREMEERD ed. worden ingevuld.

            ok=Kaart->Date (DOOP,buf);                                  // zie hier boven m. m.
     

  •    KaartVader=KaartZoon->CreateSheet(VADER);                    // creeert Kaart van de vader
  •    KaartVrouw=KaartMan->CreateSheet(PARTNER);               // creeert Kaart van partner
  •    KaartenKinderen=KaartPa->CreateSheet(KIND, KaartMa); // creeert de kaarten van de kinderen als een linked list


  • Eerste aanzet

    Zoals gezegd: dit is een eerste aanzet. Ik heb geen idee waar ik aan begin. Misschien is het wel weer een flop.
    Het ligt in de bedoeling om meer functies te creeren.

    Op- en aanmerkingen stel ik zeer op prijs.

    Een probleem kan ik nu al voorzien. Door de 'name mangling', kan het zijn dat Oedipus de RunUser() functie in de DLL niet kan vinden.
    Overkomt u dit, geef me dan een seintje. Dan zal ik daar iets op verzinnen.

    O ja, vergeten te vermelden. De Plug-Ins zitten achter het wachtwoord! Bestanden van anderen kunnen dus niet worden geplunderd!

    Wilt u op de hoogte worden gehouden van veranderingen, geef me dan een mailtje.

    Leen Lamain